package com.robert.vesta.sample.embed;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.rpc.service.GenericService;

/**
 * 泛化调用，实现接口
 *
 * todo：cache
 */
public class GenericServiceMain {
    public static void main(String[] args) {
        /*ApplicationContext ac = new ClassPathXmlApplicationContext(
                "spring/vesta-service-sample.xml");
        IdService idService = (IdService) ac.getBean("idService");

        long id = idService.genId();
        Id ido = idService.expId(id);

        System.out.println(id + ":" + ido);*/

        // 引用远程服务
// 该实例很重量，里面封装了所有与注册中心及服务提供方连接，请缓存
       /* ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        reference.setApplication(new ApplicationConfig("vesta-sample-embed"));

        reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));

// 弱类型接口名
        reference.setInterface("com.robert.vesta.service.intf.IdService");
// 声明为泛化接口
        reference.setGeneric(true);
        reference.setTimeout(3000);
        reference.setVersion("1.0.0");

// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
        GenericService genericService = reference.get();
// 基本类型以及Date,List,Map等不需要转换，直接调用
        Object result = genericService.$invoke("genId",
                null, null);

        System.out.println(result.toString());*/


        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        // 应用配置
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("demo-consumer");
        // 引用远程服务
        // 该实例很重量，里面封装了所有与注册中心及服务提供方连接，请缓存
        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        reference.setRegistry(registryConfig);
        reference.setApplication(applicationConfig);
        // 弱类型接口名
        reference.setInterface("com.robert.vesta.service.intf.IdService");
        // 声明为泛化接口
        reference.setGeneric(true);
        GenericService genericService = reference.get();
        // 基本类型以及Date,List,Map等不需要转换，直接调用
        //没有参数的
        Object result = genericService.$invoke("genId", null, null);
        System.err.println("result:"+result.toString());

    }
}
